package com.ht.api.call.func.impl.wwx;

import javax.sql.DataSource;

import com.ht.api.bean.AjaxResult;
import com.ht.api.bean.LoginBean;
import com.ht.api.call.func.IFunctionCall;
import com.ht.api.db.Db;
import com.ht.api.db.Entity;
import com.ht.api.db.exception.HtException;
import com.ht.api.open.OpenUtil;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 删除企微标签
 * @author asq
 * @createTime 2025年1月13日 22:19:08
 */
@Slf4j
public class WwxTagDelFunctionCall implements IFunctionCall {
	/** 接口ID：删除企业客户标签 */
	protected static final long API_ID = 1896076815693385728L;

	@Override
	public String getName() {
		return "删除企微标签";
	}

	@Override
	public JSONObject execute(LoginBean me, JSONObject param, AjaxResult result) {
		// 获取登陆用户的数据源
		DataSource ds = me.getDataSource();
		
		// 验证参数
		checkParam(ds, param);
		
		// 调用企微接口，删除企微标签
		String appId = param.getStr("appid");
		param.remove("appid");
		String str = OpenUtil.call(appId, API_ID, param);
		
		// 如果企微接口调用成功，则操作本地数据库
		JSONObject obj = JSONUtil.parseObj(str);
		if (obj.getInt("errcode") == 0) {
			delTagOrTagGroup(ds, param, appId);
		} else {
			throw new HtException("企微接口返回错误：" + obj.getStr("errmsg"));
		}
		
		
		return JSONUtil.createObj();
	}

	/**
	 * 删除企微标签或标签组
	 * @param ds 数据源
	 * @param param 参数
	 * @param appId 应用ID
	 */
	private void delTagOrTagGroup(DataSource ds, JSONObject param, String appId) {
		// 标签或标签组ID数组
		JSONArray tagArr = param.getJSONArray("tag_id");
		JSONArray tagGroupArr = param.getJSONArray("group_id");
		
		// 删除标签组
		if (tagGroupArr != null && !tagGroupArr.isEmpty()) {
			for (int i = 0; i < tagGroupArr.size(); i++) {
				Entity wxGroupTag = Db.createEntity("wx_group_tag");
				wxGroupTag.set("group_id", tagGroupArr.get(i));
				wxGroupTag.set("tenant_appid", appId);
				Db.delete(ds, wxGroupTag);
			}
		}
		
		// 删除标签
		if (tagArr != null && !tagArr.isEmpty()) {
			for (int i = 0; i < tagArr.size(); i++) {
				Entity wxTag = Db.createEntity("wx_tag");
				wxTag.set("id", tagArr.get(i));
				wxTag.set("tenant_appid", appId);
				Db.delete(ds, wxTag);
			}
		}
	}

	/**
	 * 验证参数合法性
	 * @param ds 数据源
	 * @param param
	 */
	private void checkParam(DataSource ds, JSONObject param) {
		// tag_id和group_id不能同时为空~
		JSONArray tagArr = param.getJSONArray("tag_id");
		JSONArray tagGroupArr = param.getJSONArray("group_id");
		if ((tagArr == null || tagArr.isEmpty())
				&& (tagGroupArr == null || tagGroupArr.isEmpty())) {
			throw new HtException("tag_id和group_id不能同时为空~");
		}
		
		// 验证appid
		if (StrUtil.isBlank(param.getStr("appid"))) {
			throw new HtException("appid字段不能为空~");
		}
	}
}
